---
id: 严格模式
title: 严格模式
---

### 为什么会有严格模式（产生的目的）

• 消除 Javascript 语法的一些不合理、不严谨之处，减少一些怪异行为;  
• 消除代码运行的一些不安全之处，保证代码运行的安全；  
• 提高编译器效率，增加运行速度；  
• 为未来新版本的 Javascript 做好铺垫。

### 严格模式的使用方法

1.脚本使用

```
　　<script>
　　　　"use strict";
　　　　console.log("严格模式");
　　</script>
```

2.函数内使用

```
　　function strict(){
　　　　"use strict";
　　　　return "严格模式";
　　}
```

### 严格模式和非严格模式下的区别?

函数：
不能以 eval 或 arguments 作为名称和参数。

```js
function f(eval, arguments) {
  // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
  "use strict";
}
```

在严格模式下，不允许使用未声明变量。

```js
<script>"use strict"; a = 1; // 报错 未声明 console.log(a);</script>
```

- 严格模式下禁止使用 with 语句

```js
"use strict";

var v = 1;

with (o) {
  // 语法错误
  v = 2;
}
```

- 函数内 this 指向改变  
  正常情况下函数内 this 指向 Window  
  严格模式下指向 undefined

```js
<script>
      "use strict";

      function fn(){
        console.log(this); // undefined
      }

      fn()
</script>
```

- 严格模式下函数形参不允许重名

```js
<script>
  "use strict"; function fn(a,a){}
  // Uncaught SyntaxError: Duplicate parameter name not allowed in this context
</script>
```

- 不允许使用保留字

```js
function package(protected) {
  // Uncaught SyntaxError: Unexpected strict mode reserved word

  "use strict";

  var implements; // 语法错误
}
```

- 严格模式下函数内 arguments 不允许赋值

```js
<script>
  "use strict" function fn(a)
  {
    (arguments = []) // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
  }
  fn('1')
</script>
```

- arguments 不再追踪参数的变化

```js
function f(a) {
  a = 2;
  return [a, arguments[0]];
}

f(1); // 正常模式为[2,2]

function f(a) {
  "use strict";
  a = 2;
  return [a, arguments[0]];
}

f(1); // 严格模式为[2,1]
```

- 禁止使用 arguments.callee
  这意味着，你无法在匿名函数内部调用自身了。

```js
"use strict";

function fn() {
  console.log(1);
  arguments.callee();
}

fn(); // 报错
```

- 禁止使用八进制语法

```js
"use strict";
//二进制0b开头
//八进制0开头
//十六进制0x开头

var a = 0b10;
var b = 070;
var c = 0x36;
```
